记录一次阿里云Mysql 数据库恢复 qp.xb文件恢复数据 您所在的位置:网站首页 ubuntu 备份文件后缀 记录一次阿里云Mysql 数据库恢复 qp.xb文件恢复数据

记录一次阿里云Mysql 数据库恢复 qp.xb文件恢复数据

2023-11-05 03:43| 来源: 网络整理| 查看: 265

🦤\背景起因

数据库因为某种情况被删掉了一列数据,需要恢复数据。

但是使用的是阿里云的MySQL,阿里云的数据库都是有备份的,但是可能是一天一次,数据还是会有影响的。

🦧\备份机制

简单讲一下备份的机制和原理,有助于后面备份还原

原理其实很简单,阿里云也是使用的已有的开源备份软件

使用的是哪个开源软件呢? 开源软件Percona Xtrabackup可以用于对数据库进行备份恢复

所以你自己发数据库需要定时备份的话,也可以用这个软件每天定时跑一下脚本备份一下,阿里云本身就提供了这个备份 本来期待可以单表恢复,结果还是给了全库让自己去恢复数据(0.0)

所以你需要安装Xtrabackup的软件来恢复

🦀\恢复数据

动手开始恢复

首先肯定是官方的教程,这里面也给你讲了,你可以下载几种格式的文件来恢复数据。

https://help.aliyun.com/knowledge_detail/41817.html?spm=a2c4g.11186623.6.751.793f4bd6WWNg0y

目前物理备份集文件有几种格式: tar 压缩包 (.tar.gz 后缀) xbstream 压缩包 (.xb.gz 后缀) xbstream 文件包(_qp.xb 后缀) xbstream qpress压缩包(_xb.qp后缀)

我拿到的是这个文件

xxx129_qp.xb

就跟着教程走就查不多,讲一下中间的坑。

1\🦐 准备linux系统,centos最好

我建议使用linux服务器,因为安装软件比较方便,自己使用的是mac,本来打算在自己机器上装mysql然后恢复成表就好了,但是mac下权限很复杂,

就安装qpress和Percona XtraBackup就有问题,比如没法把sh移动到/usr/bin/下面去,最后直接用centos7服务器安装这些软件都是很顺利的,基本跟着教程都能一遍过

2\🐡 装必要的恢复软件

安装qpress就按照官方给的命令执行

wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar" tar xvf qpress-11-linux-x64.tar chmod 775 qpress cp qpress /usr/bin

获取xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

安装

yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm

获取mysql

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

安装

yum -y install mysql57-community-release-el7-10.noarch.rpm

装MySQL服务,这个其实装好之后不用启动,因为后面我们要指定配置启动。

yum -y install mysql-community-server 3\🐬实施恢复

还是跟着教程走

对于xbstream 文件包(_qp.xb 后缀)

cat | xbstream -x -v -C /home/mysql/data

这里的/home/mysql/data我们没有这个文件夹,最好就直接先新建一下,这样后面很多的命令就不用改很多代码,如果你实在受不了新建这样一个文件夹,你可以做完之后删除掉就好了。

你可以cd到你的qp.xb文件的路径下,或者指定路径执行,这样执行完就会在/home/mysql/data下面有解压出的文件夹。然后再执行解压

## MySQL 5.6/5.7解压 innobackupex --decompress --remove-original /home/mysql/data

这个解压出来的文件还是不能用,后缀还不是frm和ibd,继续解压

## MySQL 5.6/5.7 innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data

这个执行完成,应该就是你的数据库真实的文件了,下面需要把用户和权限组设置给mysql,这样启动起来mysql才有读写的权限。

chown -R mysql:mysql /home/mysql/data 4\🐳 恢复到数据库

其实我们已经拿到了mysql的数据库文件,如果你去看下本地的数据库启动起来的话,也就是这些文件,所以备份机制就是全表文件备份(就是把你mysql相关的文件打包压缩),然后你恢复的时候再替换成备份文件而已。

下面是关键的语句

mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

这句话理解起来其实很简单,就是指定配置的启动MySQL。指定了MySQL的数据库文件存储文件夹,这样就能读取到你的备份文件了。

但是这里有几个坑需要注意,❎不要试图把你的备份文件直接拷贝到mysql的本身的数据库存储文件夹/var/lib/mysql/,直接替换是不行的。

因为我尝试了一下,按照生产环境创建了数据库和表,,看到生成了frm和ibd文件,然后李代桃僵,替换文件,还更换权限人和权限组,(cp这个动作会让所有人和权限组又变成root,你还需要改成mysql🥞 结果证明没用-.-.)

拷贝进去确实你可以使用show databases; show tables;但是无法select查询 为啥都识别出数据库和表了,却不能select? 说明show databases; show tables;命令是直接读取目录下文件的,而且是明文的,而具体的表的数据是需要读取文件,并且需要解密(解码)的。

结果肯定是不行,替换mysql文件就能读取数据库数据的话明显就是漏洞了,数据就没有安全性可言,mysql设置的东西确实不可能这样让你就把数据替换了,哈哈哈哈哈

5\💡关键点

其实照着教程基本没问题,但是教程不会告诉你为什么这样可以那样不行, 首先这段代码我们不能全抄。

mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

我们理解一下前面是指定配置,主要是怕不兼容,但是我版本一致,而且我照着教程配置,怎么都启动不了,就拿第一个说添加参数,这个参数添加再哪里?开头还是末尾?注释掉不支持的参数?不支持的有哪些? 在这里插入图片描述 直接说怎么解决问题,把指定这个配置文件去掉就好了,我们并不需要额外指定配置

mysqld --user=mysql --datadir=/home/mysql/data &

启动成功,连接MySQL。。

密码错误❌ 我不是设过密码了么? 难道指定配置就又创建了密码?

grep "password" /var/log/mysqld.log

还是之前的这个日志啊,试试

密码错误❌

我突然意识到问题所在了,找到项目里面的账号密码,输入

成功进入✅,查询数据也正常。

🦉\数据恢复与安全问题讨论总结

数据恢复说到底还是文件恢复,就像拷贝一份文件一样,就像linux其实就是一切都是文件,哪怕你的进程也是一个个文件来表示的。

数据恢复比较简单,但是第一次接触的时候还是要花费比较长的时间,所以这是我写我恢复的经历的原因,能节约到其他人的时间,那就是这篇文章的价值。

数据库恢复操作原理并不复杂,包括阿里的数据库每天的备份也是依靠现有 的开源软件来实现和处理,所以开源的好处在于,你只是做了一部分,但是后来的人会基于你的成果再做出一点点,最后成了科技的大厦,站在巨人的肩膀上不可耻,因为后面的我们也会是巨人的一部分。

MySQL这样成熟的软件必然考虑到安全性和安全隐患,简单的狸猫换太子还是不能让你成功的,你可以看到数据库,但是你不能查出里面的数据,这就是取舍,结合下来,对核心的加密,你拿到数据库文件还是没用,还是需要密码才能解开,这才合理。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有